//École de Technologie Supérieure (ÉTS)
//LOG720 - Laboratoire 3  - Intégration de Spring + Hibernate
//Date de remise: 2011-12-13
//Auteurs:
//Jonathan Aubuchon (AUBJ18038704)
//Jeff Grenier (GREJ02098703)
//Francis Paré (PARF21038708)

package springapp.repository;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;

import springapp.domain.Dossier;
import springapp.domain.Infraction;
import springapp.domain.NoPermisInvalideException;
import util.HibernateUtil;

/*
 * Data Acces Object pour les dossiers
 */

public class DossierDAO  {

	/**
	 * Retourne la totalit� des dossiers sous la forme d'une collection de dossiers.
	 * @return 
	 */
	public List<Dossier> selectDossiers(){
		//HibernateUtil.getSessionFactory().getCurrentSession().close();
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();

		session.beginTransaction();

//		List<Dossier> result = (List<Dossier>)session.createQuery("from Dossier").list();
//		List infractions;
//		for(Dossier d:result){
//			String query = "select d.infractions from Dossier d where d.id = :pid";
//			infractions = session.createQuery(query)
//					.setParameter("pid", d.getId()).list();
//			d.setInfractions(infractions);
//		}
//		session.getTransaction().commit();
		Criteria dossiers = session.createCriteria(Dossier.class);
		dossiers.addOrder(Order.asc("nom"));

		
		return dossiers.list();
	}
	
	/**
	 * retourne un dossier en fonction du ID fournit
	 * @param dossierID
	 * @return
	 */
	public Dossier selectDossier(int idDossier){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();

		Dossier dos = (Dossier) session.load(Dossier.class, idDossier);
		
//		List infractions;
//		String query = "select d.infractions from Dossier d where d.id = :pid";
//		infractions = session.createQuery(query)
//				.setParameter("pid", dos.getId()).list();
//		
//		dos.setInfractions(infractions);
//		session.getTransaction().commit();
		
		return dos;
	}
	
	
	/**
	 * Ajoute un nouveau dossier au syst�me.
	 * Retourne true si l'ajout a fonctionn�, sinon false en cas d'�chec
	 * @param infraction
	 * @return
	 */
	public boolean insertDossier(Dossier dossier) 
		throws NoPermisInvalideException{
		boolean isGood = true;
		
		try{
			for(Dossier d : selectDossiers()){
				if(d.getNoPermis().equals(dossier.getNoPermis()))
					throw new NoPermisInvalideException();
			}
			
			Session session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			session.save(dossier);
			session.getTransaction().commit();
		}
		catch(Exception e){
			isGood = false;
		}
		return isGood;
	}
	
	/**
	 * Ajoute une nouvelle infraction � un dossier.
	 * Retourne true si l'ajout a fonctionn�, sinon false en cas d'�chec
	 * @param infraction
	 * @return
	 */
	public boolean insertInfractionAuDossier(int dossierID, int infractionID){
		boolean isGood = true;
		
		try{
			Session session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
	
			Dossier dos = (Dossier) session.load(Dossier.class, dossierID);
			Infraction inf = (Infraction) session.load(Infraction.class, infractionID);	
			//session.getTransaction().commit();
			
			dos.addInfraction(inf);
			
			session.update(dos);
			session.getTransaction().commit();
		}
		catch(Exception e){
			System.out.println(e);
			isGood = false;
		}
		return isGood;
	}
}
